Communicating Variables to a Sub-make

Contents|Index|Previous|Next
Communicating variables to a sub-make

Variable values of the top-level make can be passed to the sub-make through the environment by explicit request. These variables are defined in the sub-make as defaults, but do not override what is specified in the makefile used by the sub-make makefile unless you use the ‘-e’ switch (see Summary of options).

To pass down, or export, a variable, make adds the variable and its value to the environment for running each command. The sub-make,in turn, uses the environment to initialize its table of variable values. See Variables from the environment.

Except by explicit request, make exports a variable only if it is either defined in the environment initially or set on the command line, and if its name consists only of letters, numbers, and underscores.

Some shells cannot cope with environment variable names consisting of characters other than letters, numbers, and underscores. The special variables, SHELL and MAKEFLAGS, are always exported (unless you unexport them). MAKEFILES is exported if you set it to anything.

make automatically passes down variable values that were defined on the command line, by putting them in the MAKEFLAGS variable. See Communicating variables to a sub-make.

Variables are not normally passed down if they were created by default by make (see Variables used by implicit rules). The sub-make will define these for itself.

If you want to export specific variables to a sub-make, use the export directive like: export variable ....

If you want to prevent a variable from being exported, use the unexport directive, like: unexport variable ....

As a convenience, you can define a variable and export it at the same time by using export variable = value (which has the same result as variable = value export variable) and export variable := value (which has the same result as variable := value export variable).

Likewise, export variable += value is just like variable += value export variable.

See Appending more text to variables. You may notice that the export and unexport directives work in make in the same way they work in the shell, sh.

If you want all variables to be exported by default, you can use export by itself: export. This tells make that variables which are not explicitly mentioned in an export or unexport directive should be exported. Any variable given in an unexport directive will still not be exported. If you use export by itself to export variables by default, variables whose names contain characters other than alphanumerics and underscores will not be exported unless specifically mentioned in an export directive.

The behavior elicited by an export directive by itself was the default in older versions of GNU make. If your makefiles depend on this behavior and you want to be compatible with old versions of make, you can write a rule for the special target, .EXPORT_ALL_VARIABLES, instead of using the export directive. This will be ignored by old makes, while the export directive will cause a syntax error.

Likewise, you can use unexport by itself to tell make not to export variables by default. Since this is the default behavior, you would only need to do this if export had been used by itself earlier (in an included makefile, perhaps). You cannot use export and unexport by themselves to have variables exported for some commands and not for others. The last export or unexport directive that appears by itself determines the behavior for the entire run of make.

As a special feature, the variable, MAKELEVEL, is changed when it is passed down from level to level. This variable’s value is a string which is the depth of the level as a decimal number. The value is ‘0’ for the top-level make;‘1’ for a sub-make,‘2’ for a sub-sub-make, and so on. The incrementation happens when make sets up the environment for a command.

The main use of MAKELEVEL is to test it in a conditional directive (see Conditional parts of makefiles); this way you can write a makefile that behaves one way if run recursively and another way if run directly by you.

You can use the variable, MAKEFILES, to cause all sub-make commands to use additional makefiles. The value of MAKEFILES is a whitespace-separated list of file names. This variable, if defined in the outer-level makefile, is passed down through the environment; then it serves as a list of extra makefiles for the sub-make to read before the usual or specified ones. See The variable, MAKEFILES.

Top|Contents|Index|Previous|Next